今天要來介紹的是Case~其中一個verilog常使用到的功能。
如果有寫過程式,相信對條件的語法都不陌生~Case就是verilog的條件句,程式中會根據當前條件來對應當前遇到的case,如果符合則執行該case的指令,不符合就跳過,看下一個case,如果沒case就結束。其中的條件通常會視某個信號或變數的值。
Case就像是高階語言中的「switch」,給出幾個條件,看當前狀態符合誰,就執行他的內容。
那case在某些地方就特別需要啦~像是狀態機、解碼器及數據多工器。
這是case的基本語法:
case(expression)
value1: begin
//statements
end
value2: begin
//statements
end
//接續下去
default: begin
//statements
end
endcase
是不是跟switch很像!只是從switch變成case、從case變為value。
稍稍來說明一下這個語法結構:
這裡舉個例子:
module newwork(C);
output [1:0] C;
reg [1:0] cas;
reg [1:0] out;
always @(*)begin
case(cas)
2'b00: out = 0;
2'b01: out = 1;
2'b10: out = 2;
2'b11: out = 3;
endcase
end
assign C = out;
endmodule
這裡定義了一個2位元的輸出C、二位元暫存器cas及out。
在always的地方,out會根據cas來選擇要存的值為何,最後再將結果傳給C。
那case他還有兩個特殊的變形-casex及casez,他們主要是用來處理包含未知符號(x)及高阻抗值(z)的信號,他們會把x、z當作萬用字元,來簡化邏輯。
先來介紹casex,他表示允許使用”x”或”z”來當作萬用字元,如果遇到這兩個字元,對應的位元可對應到任何值(0、1、x、z)。
這邊就直接舉例:
module newwork(C);
output [3:0] C;
reg [3:0] sig;
reg [3:0] result;
always @(*)begin
casex(sig)
4'b1xx0: begin
result = 0;
end
default: begin
result = 1;
end
endcase
end
assign C = result;
endmodule
只要sig的最高位是1、最低位是0,result的值就會是0;否則result的值就會為1,最後再將result結果傳給C。
casez則只允許”z”做為萬用字元,遇到”x”的話會代表未知,不會是萬用狀態,所以得精確對應。
這裡舉個與casex相似的例子,只改變case的部分:
module newwork(C);
output [3:0] C;
reg [3:0] sig;
reg [3:0] result;
always @(*)begin
casez(sig)
4'b10z0: begin
result = 0;
end
default: begin
result = 1;
end
endcase
end
assign C = result;
endmodule
這裡的話,則是當sig為「4’b1000」、「4’b1010」及「4’b10z0」其中一個時會使result值為0,否則為1,最後再將結果傳給C。
那今天就先到這邊~